package com.learning.rpc.rpc.proxy;

import com.learning.rpc.rpc.Invocation;
import com.learning.rpc.rpc.Invoker;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * ClassName: ProxyFactory
 * Description: 代理工厂
 * Date: 2022/5/10 22:23 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ProxyFactory {

    /**
     * 获取动态代理（客户单使用）
     *
     * @param invoker    invoker
     * @param interfaces 被代理的接口
     * @return Object 代理对象
     */
    public static Object getProxy(Invoker invoker, Class<?>[] interfaces) {
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), interfaces, new InvokerInvocationHandler(invoker));
    }

    /**
     * 创建代理对象（服务端使用）
     *
     * @param proxy 实现类（被代理对象）
     * @param type  接口
     * @return
     */
    public static Invoker getInvoker(Object proxy, Class type) {
        return new Invoker() {
            @Override
            public Class getInterface() {
                return type;
            }

            @Override
            public Object invoke(Invocation invocation) throws Exception {
                // 反射调用对象的方法
                Method method = proxy.getClass().getMethod(invocation.getMethodName(), invocation.getParameterTypes());
                return method.invoke(proxy, invocation.getArguments());
            }
        };
    }
}
